home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cocktail
/
rex.lha
/
rex
/
lib
/
Scanner.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-08-18
|
17KB
|
447 lines
/* $Id: Scanner.c,v 2.16 1992/08/18 09:05:32 grosch rel $ */
# define bool char
# define true 1
# define false 0
# define StdIn 0
$@ # include "@.h"
$@ # include "$Source.h"
# include "System.h"
# include "General.h"
# include "DynArray.h"
# include "Positions.h"
# include <stdio.h>
# if defined __STDC__ | defined __cplusplus
# include <stdlib.h>
# else
/* extern char * malloc ();
extern void free (); */
# endif
# define yyTabSpace 8
# define yyStart(State) { yyPreviousStart = yyStartState; yyStartState = State; }
# define yyPrevious { yyStateRange s = yyStartState; \
yyStartState = yyPreviousStart; yyPreviousStart = s; }
$@ # define yyEcho { char * yyEnd = $_TokenPtr + $_TokenLength; \
char yyCh = * yyEnd; * yyEnd = '\0'; \
$@ (void) fputs ($_TokenPtr, stdout); * yyEnd = yyCh; }
$@ # define yyLess(n) { yyChBufferIndex -= $_TokenLength - n; $_TokenLength = n; }
$@ # define yyTab yyLineStart -= yyTabSpace - 1 - ((unsigned char *) $_TokenPtr - yyLineStart - 1) % yyTabSpace
$@ # define yyTab1(a) yyLineStart -= yyTabSpace - 1 - ((unsigned char *) $_TokenPtr - yyLineStart + a - 1) % yyTabSpace
$@ # define yyTab2(a,b) yyLineStart -= yyTabSpace - 1 - ((unsigned char *) $_TokenPtr - yyLineStart + a - 1) % yyTabSpace
# define yyEol(Column) { yyLineCount ++; yyLineStart = yyChBufferIndex - 1 - Column; }
# define output(c) (void) putchar ((int) c)
# define unput(c) * (-- yyChBufferIndex) = c
# define yyDNoState 0
# define yyFileStackSize 16
# define yyInitBufferSize 1024 * 8 + 256
$C constant declarations
static void yyExit () { Exit (1); }
typedef unsigned short yyStateRange;
typedef struct { yyStateRange yyCheck, yyNext; } yyCombType;
$@ char * $_TokenPtr ;
$@ short $_TokenLength ;
$@ $_tScanAttribute $_Attribute ;
$@ void (* @_Exit) () = yyExit;
static yyCombType yyComb [yyTableSize + 1] = {{1, 0},
$T
};
static yyCombType * yyBasePtr [yyDStateCount + 1] = {& yyComb [0],
$B
};
static yyStateRange yyDefault [yyDStateCount + 1] = {0,
$U
};
static yyStateRange yyEobTrans [yyDStateCount + 1] = {0,
$R
};
$M static short yyAction [yyDStateCount + 1] = {0,
$Q
$M };
static yyStateRange yyInitStateStack [yyInitBufferSize] = {0};
static yyStateRange * yyStateStack = yyInitStateStack;
static unsigned long yyStateStackSize= yyInitBufferSize;
static yyStateRange yyStartState = 0;
static yyStateRange yyPreviousStart = 1;
static short yySourceFile ;
static bool yyEof ;
static unsigned char * yyChBufferPtr ;
static unsigned char * yyChBufferStart ;
static unsigned long yyChBufferSize ;
static unsigned char * yyChBufferIndex = ((unsigned char *) yyComb) + 2; /* dirty trick */
static int yyBytesRead ;
static int yyLineCount ;
static unsigned char * yyLineStart ;
static struct {
short yySourceFile ;
bool yyEof ;
unsigned char * yyChBufferPtr ;
unsigned char * yyChBufferStart ;
unsigned long yyChBufferSize ;
unsigned char * yyChBufferIndex ;
int yyBytesRead ;
int yyLineCount ;
unsigned char * yyLineStart ;
} yyFileStack [yyFileStackSize + 1], * yyFileStackPtr = yyFileStack;
static unsigned char yyToLower [] = {
'\0', '\1', '\2', '\3', '\4', '\5', '\6', '\7',
'\10', '\11', '\12', '\13', '\14', '\15', '\16', '\17',
'\20', '\21', '\22', '\23', '\24', '\25', '\26', '\27',
'\30', '\31', '\32', '\33', '\34', '\35', '\36', '\37',
' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?',
'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', '\\', ']', '^', '_',
'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '\177',
'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
'\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
'\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
'\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
'\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
};
static unsigned char yyToUpper [] = {
'\0', '\1', '\2', '\3', '\4', '\5', '\6', '\7',
'\10', '\11', '\12', '\13', '\14', '\15', '\16', '\17',
'\20', '\21', '\22', '\23', '\24', '\25', '\26', '\27',
'\30', '\31', '\32', '\33', '\34', '\35', '\36', '\37',
' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?',
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', '\177',
'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
'\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
'\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
'\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
'\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
};
static void yyInitialize ();
static void yyErrorMessage ARGS((int yyErrorCode));
static char input ();
$G global user declarations
$@ int $_GetToken ()
{
register yyStateRange yyState;
register yyStateRange * yyStatePtr;
register unsigned char * yyChBufferIndexReg;
register yyCombType * * yyBasePtrReg = yyBasePtr;
$L local user declarations and actions
yyBegin:
yyState = yyStartState; /* initialize */
yyStatePtr = & yyStateStack [1];
yyChBufferIndexReg = yyChBufferIndex;
$@ $_TokenPtr = (char *) yyChBufferIndexReg;
$J if (yyChBufferIndexReg [-1] == yyEolCh) yyState ++;
/* ASSERT yyChBuffer [yyChBufferIndex] == first character */
yyContinue: /* continue after sentinel or skipping blanks */
for (;;) { /* execute as many state transitions as possible */
/* determine next state and get next character */
register yyCombType * yyTablePtr = (yyBasePtrReg [yyState] + * yyChBufferIndexReg ++);
if (yyTablePtr->yyCheck == yyState) {
yyState = yyTablePtr->yyNext;
* yyStatePtr ++ = yyState; /* push state */
goto yyContinue;
}
yyChBufferIndexReg --; /* reconsider character */
if ((yyState = yyDefault [yyState]) == yyDNoState) break;
}
for (;;) { /* search for last final state */
$@ $_TokenLength = yyChBufferIndexReg - (unsigned char *) $_TokenPtr;
yyChBufferIndex = yyChBufferIndexReg;
$A switch header and user actions /* switch (* -- yyStatePtr) { /* pop state */
$N non final states
/* non final states */
yyChBufferIndexReg --; /* return character */
break;
$P case yyDefaultState:
$@ $_Attribute.Position.Line = yyLineCount;
$@ $_Attribute.Position.Column = yyChBufferIndexReg - yyLineStart;
$@ /* $_TokenLength = 1; */
yyChBufferIndex = ++ yyChBufferIndexReg;
{
$D default action
}
goto yyBegin;
case yyDNoState: /* automatic initialization */
yyInitialize ();
yySourceFile = StdIn;
goto yyBegin;
$O case yyEobState: /* end of buffer sentinel found */
yyChBufferIndex = -- yyChBufferIndexReg; /* undo last state transition */
$@ if (-- $_TokenLength == 0) { /* get previous state */
yyState = yyStartState;
$J if (yyChBufferIndexReg [-1] == yyEolCh) yyState ++;
} else {
yyState = * (yyStatePtr - 1);
}
if (yyChBufferIndex != & yyChBufferStart [yyBytesRead]) {
/* end of buffer sentinel in buffer */
if ((yyState = yyEobTrans [yyState]) == yyDNoState) continue;
yyChBufferIndexReg ++;
* yyStatePtr ++ = yyState; /* push state */
goto yyContinue;
}
/* end of buffer reached */
{ /* copy initial part of token in front of the input buffer */
$@ register char * yySource = $_TokenPtr;
$@ register char * yyTarget = $_TokenPtr = (char *) & yyChBufferPtr [yyMaxAlign - $_TokenLength % yyMaxAlign];
if (yySource != yyTarget) {
while (yySource < (char *) yyChBufferIndexReg) * yyTarget ++ = * yySource ++;
yyLineStart += (unsigned char *) yyTarget - yyChBufferStart - yyBytesRead;
yyChBufferStart = (unsigned char *) yyTarget;
} else {
yyChBufferStart = yyChBufferIndexReg;
}
}
if (! yyEof) { /* read buffer and restart */
$@ int yyChBufferFree = (int) Exp2 (Log2 (yyChBufferSize - 4 - yyMaxAlign - $_TokenLength));
if (yyChBufferFree < yyChBufferSize / 8) {
register int yyDelta;
register unsigned char * yyOldChBufferPtr = yyChBufferPtr;
ExtendArray ((char * *) & yyChBufferPtr, & yyChBufferSize, sizeof (char));
if (yyChBufferPtr == NULL) yyErrorMessage (1);
yyDelta = yyChBufferPtr - yyOldChBufferPtr;
yyChBufferStart += yyDelta;
yyLineStart += yyDelta;
$@ $_TokenPtr += yyDelta;
$@ yyChBufferFree = (int) Exp2 (Log2 (yyChBufferSize - 4 - yyMaxAlign - $_TokenLength));
if (yyStateStackSize < yyChBufferSize) {
yyStateRange * yyOldStateStack = yyStateStack;
ExtendArray ((char * *) & yyStateStack, & yyStateStackSize, sizeof (yyStateRange));
if (yyStateStack == NULL) yyErrorMessage (1);
yyStatePtr += yyStateStack - yyOldStateStack;
}
}
yyChBufferIndex = yyChBufferIndexReg = yyChBufferStart;
$@ yyBytesRead = $_GetLine (yySourceFile, (char *) yyChBufferIndex, yyChBufferFree);
if (yyBytesRead <= 0) { yyBytesRead = 0; yyEof = true; }
yyChBufferStart [yyBytesRead ] = yyEobCh;
yyChBufferStart [yyBytesRead + 1] = '\0';
goto yyContinue;
}
$@ if ($_TokenLength == 0) { /* end of file reached */
$@ $_Attribute.Position.Line = yyLineCount;
$@ $_Attribute.Position.Column = yyChBufferIndexReg - yyLineStart;
$@ $_CloseFile ();
if (yyFileStackPtr == yyFileStack) {
$E eof action
}
$@ if (yyFileStackPtr == yyFileStack) return $_EofToken;
goto yyBegin;
}
break;
default:
yyErrorMessage (0);
}
}
}
$@ void $_BeginFile
# if defined __STDC__ | defined __cplusplus
(char * yyFileName)
# else
(yyFileName) char * yyFileName;
# endif
{
yyInitialize ();
$@ yySourceFile = $_BeginSource (yyFileName);
}
static void yyInitialize ()
{
if (yyFileStackPtr >= yyFileStack + yyFileStackSize) yyErrorMessage (2);
yyFileStackPtr ++; /* push file */
yyFileStackPtr->yySourceFile = yySourceFile ;
yyFileStackPtr->yyEof = yyEof ;
yyFileStackPtr->yyChBufferPtr = yyChBufferPtr ;
yyFileStackPtr->yyChBufferStart = yyChBufferStart ;
yyFileStackPtr->yyChBufferSize = yyChBufferSize ;
yyFileStackPtr->yyChBufferIndex = yyChBufferIndex ;
yyFileStackPtr->yyBytesRead = yyBytesRead ;
yyFileStackPtr->yyLineCount = yyLineCount ;
yyFileStackPtr->yyLineStart = yyLineStart ;
/* initialize file state */
yyChBufferSize = yyInitBufferSize;
MakeArray ((char * *) & yyChBufferPtr, & yyChBufferSize, sizeof (char));
if (yyChBufferPtr == NULL) yyErrorMessage (1);
yyChBufferStart = & yyChBufferPtr [yyMaxAlign];
yyChBufferStart [-1] = yyEolCh; /* begin of line indicator */
yyChBufferStart [ 0] = yyEobCh; /* end of buffer sentinel */
yyChBufferStart [ 1] = '\0';
yyChBufferIndex = yyChBufferStart;
yyEof = false;
yyBytesRead = 0;
yyLineCount = 1;
yyLineStart = & yyChBufferStart [-1];
if (yyStartState == 0) {
yyStartState = STD;
yyStateStack [0] = yyDefaultState; /* stack underflow sentinel */
}
}
$@ void $_CloseFile ()
{
if (yyFileStackPtr == yyFileStack) yyErrorMessage (3);
$@ $_CloseSource (yySourceFile);
ReleaseArray ((char * *) & yyChBufferPtr, & yyChBufferSize, sizeof (char));
/* pop file */
yySourceFile = yyFileStackPtr->yySourceFile ;
yyEof = yyFileStackPtr->yyEof ;
yyChBufferPtr = yyFileStackPtr->yyChBufferPtr ;
yyChBufferStart = yyFileStackPtr->yyChBufferStart ;
yyChBufferSize = yyFileStackPtr->yyChBufferSize ;
yyChBufferIndex = yyFileStackPtr->yyChBufferIndex ;
yyBytesRead = yyFileStackPtr->yyBytesRead ;
yyLineCount = yyFileStackPtr->yyLineCount ;
yyLineStart = yyFileStackPtr->yyLineStart ;
yyFileStackPtr --;
}
$@ int $_GetWord
# if defined __STDC__ | defined __cplusplus
(char * yyWord)
# else
(yyWord) char * yyWord;
# endif
{
$@ register char * yySource = $_TokenPtr;
register char * yyTarget = yyWord;
register char * yyChBufferIndexReg = (char *) yyChBufferIndex;
do { /* ASSERT word is not empty */
* yyTarget ++ = * yySource ++;
} while (yySource < yyChBufferIndexReg);
* yyTarget = '\0';
$@ return yyChBufferIndexReg - $_TokenPtr;
}
$@ int $_GetLower
# if defined __STDC__ | defined __cplusplus
(char * yyWord)
# else
(yyWord) char * yyWord;
# endif
{
$@ register char * yySource = $_TokenPtr;
register char * yyTarget = yyWord;
register char * yyChBufferIndexReg = (char *) yyChBufferIndex;
do { /* ASSERT word is not empty */
* yyTarget ++ = yyToLower [* yySource ++];
} while (yySource < yyChBufferIndexReg);
* yyTarget = '\0';
$@ return yyChBufferIndexReg - $_TokenPtr;
}
$@ int $_GetUpper
# if defined __STDC__ | defined __cplusplus
(char * yyWord)
# else
(yyWord) char * yyWord;
# endif
{
$@ register char * yySource = $_TokenPtr;
register char * yyTarget = yyWord;
register char * yyChBufferIndexReg = (char *) yyChBufferIndex;
do { /* ASSERT word is not empty */
* yyTarget ++ = yyToUpper [* yySource ++];
} while (yySource < yyChBufferIndexReg);
* yyTarget = '\0';
$@ return yyChBufferIndexReg - $_TokenPtr;
}
static char input ()
{
if (yyChBufferIndex == & yyChBufferStart [yyBytesRead]) {
if (! yyEof) {
yyLineStart -= yyBytesRead;
yyChBufferIndex = yyChBufferStart = yyChBufferPtr;
$@ yyBytesRead = $_GetLine (yySourceFile, (char *) yyChBufferIndex,
(int) Exp2 (Log2 (yyChBufferSize)));
if (yyBytesRead <= 0) { yyBytesRead = 0; yyEof = true; }
yyChBufferStart [yyBytesRead ] = yyEobCh;
yyChBufferStart [yyBytesRead + 1] = '\0';
}
}
if (yyChBufferIndex == & yyChBufferStart [yyBytesRead]) return '\0';
else return * yyChBufferIndex ++;
}
$@ void $_BeginScanner ()
{
$I user initialization code
}
$@ void $_CloseScanner ()
{
$F user finalization code
}
static void yyErrorMessage
# if defined __STDC__ | defined __cplusplus
(int yyErrorCode)
# else
(yyErrorCode) int yyErrorCode;
# endif
{
$@ WritePosition (stderr, $_Attribute.Position);
switch (yyErrorCode) {
$@ case 0: (void) fprintf (stderr, ": @: internal error\n"); break;
$@ case 1: (void) fprintf (stderr, ": @: out of memory\n"); break;
$@ case 2: (void) fprintf (stderr, ": @: too many nested include files\n"); break;
$@ case 3: (void) fprintf (stderr, ": @: file stack underflow (too many calls of $_CloseFile)\n"); break;
}
$@ @_Exit ();
}